package util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.Date;
import java.util.Map;

/**
 * @author Macross
 * @Type JwtUtil.java
 * @Desc JWT工具类
 * @date 2019/12/24 15:51
 */

@ConfigurationProperties(prefix = "jwt")
@Data
public class JwtUtil {

    /**
     * jwt签名
     */

    private String key;

    /**
     * 过期时间
     */
    private long ttl;

    /**
     * 生成jwt的token
     * @param params jwt存放的参数
     * @param subject 主体信息[用户名]
     * @param id token的id[用户id]
     * @return
     */
    public String createToken(Map<String,Object> params,String subject,String id){
        //判断subject和id是否为空
        if (StringUtils.isNotBlank(id) && StringUtils.isNotBlank(subject)) {
            //根据id,当前日期,主体信息以及签名去生成jwtbuilder对象
            JwtBuilder jwtBuilder = Jwts.builder().setId(id)
                    .setIssuedAt(new Date())
                    .setSubject(subject)
                    .signWith(SignatureAlgorithm.HS256,key);
            //判断map是否为空
            if (params != null && params.size()>0){
                //遍历map,并将其内容放入jwtbuilder中
                params.forEach(jwtBuilder::claim);
            }
            //判断超时时间是否大于0
            if (ttl > 0){
                //设置超时时间
                jwtBuilder.setExpiration(new Date(System.currentTimeMillis()+ttl));
            }
            //返回token
            return jwtBuilder.compact();
        }
        //返回null
        return null;
    }

    /**
     * 解析token
     * @param token 需要解析的token
     * @return
     */
    public Claims parseToken(String token){
        //判断token是否为空
        if (StringUtils.isNotBlank(token)) {
            //解析token,返回解析结果
            return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
        }
        //返回null
        return null;
    }
}
